package cn.harry.cabinet.server.dto.user

import cn.harry.cabinet.model.enums.Gender
import cn.harry.cabinet.model.enums.UserStatus
import kotlinx.serialization.InternalSerializationApi
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

/**
 * 用户表单请求DTO - 用于创建和更新用户
 */
@InternalSerializationApi
@Serializable
data class UserFormRequest(
    @SerialName("name")
    val name: String,

    @SerialName("employeeId")
    val employeeId: String,

    @SerialName("phoneNumber")
    val phoneNumber: String,

    @SerialName("position")
    val position: String = "",

    @SerialName("gender")
    val gender: Gender = Gender.MALE,

    @SerialName("status")
    val status: UserStatus = UserStatus.ENABLED,

    @SerialName("cardNumber")
    val cardNumber: String = "",

    @SerialName("featureCode")
    val featureCode: String = "",

    @SerialName("password")
    val password: String = "",
) {
    /**
     * 验证请求数据的有效性
     */
    fun isValid(): Boolean {
        return name.isNotBlank() && employeeId.isNotBlank() && phoneNumber.isNotBlank()
    }

    /**
     * 获取验证错误信息
     */
    fun getValidationErrors(): List<String> {
        val errors = mutableListOf<String>()

        if (name.isBlank()) {
            errors.add("姓名不能为空")
        }

        if (employeeId.isBlank()) {
            errors.add("工号不能为空")
        }

        if (phoneNumber.isBlank()) {
            errors.add("手机号不能为空")
        }
        if (password.isBlank()) {
            errors.add("密码不能为空")
        }

        return errors
    }

    /**
     * 验证重复字段（需要传入UserRepository进行数据库查询）
     */
    suspend fun validateUniqueFields(
        userRepository: cn.harry.cabinet.repository.UserRepository,
        excludeUserId: Long = 0
    ): List<String> {
        val errors = mutableListOf<String>()

        // 检查工号是否重复
        if (employeeId.isNotBlank() && userRepository.isEmployeeIdExists(
                employeeId,
                excludeUserId
            )
        ) {
            errors.add("工号 '$employeeId' 已存在")
        }

        // 检查特征码是否重复（只有填写了才检查）
        if (featureCode.isNotBlank() && userRepository.isFeatureCodeExists(
                featureCode,
                excludeUserId
            )
        ) {
            errors.add("特征码 '$featureCode' 已存在")
        }

        return errors
    }
} 